// RAP [rh] File-based editors (and thus file extensions) don't make sense in RAP ///******************************************************************************* // * Copyright (c) 2000, 2007 IBM Corporation and others. // * All rights reserved. This program and the accompanying materials // * are made available under the terms of the Eclipse Public License v1.0 // * which accompanies this distribution, and is available at // * http://www.eclipse.org/legal/epl-v10.html // * // * Contributors: // * IBM Corporation - initial API and implementation // * Benjamin Muskalla - Bug 29633 [EditorMgmt] "Open" menu should // * have Open With-->Other // *******************************************************************************/ //package org.eclipse.ui.internal.dialogs; // //import java.util.ArrayList; //import java.util.HashMap; //import java.util.Iterator; //import java.util.List; //import java.util.Map; // //import org.eclipse.core.runtime.Assert; //import org.eclipse.core.runtime.Platform; //import org.eclipse.core.runtime.content.IContentType; //import org.eclipse.jface.dialogs.MessageDialog; //import org.eclipse.jface.preference.IPreferenceStore; //import org.eclipse.jface.preference.PreferencePage; //import org.eclipse.jface.window.Window; //import org.eclipse.osgi.util.NLS; //import org.eclipse.swt.SWT; //import org.eclipse.swt.graphics.Image; //import org.eclipse.swt.layout.GridData; //import org.eclipse.swt.layout.GridLayout; //import org.eclipse.swt.widgets.Button; //import org.eclipse.swt.widgets.Composite; //import org.eclipse.swt.widgets.Control; //import org.eclipse.swt.widgets.Event; //import org.eclipse.swt.widgets.Label; //import org.eclipse.swt.widgets.Listener; //import org.eclipse.swt.widgets.Table; //import org.eclipse.swt.widgets.TableItem; //import org.eclipse.ui.IEditorDescriptor; //import org.eclipse.ui.IFileEditorMapping; //import org.eclipse.ui.IWorkbench; //import org.eclipse.ui.IWorkbenchPreferencePage; //import org.eclipse.ui.dialogs.EditorSelectionDialog; //import org.eclipse.ui.dialogs.PreferenceLinkArea; //import org.eclipse.ui.internal.IWorkbenchHelpContextIds; //import org.eclipse.ui.internal.WorkbenchMessages; //import org.eclipse.ui.internal.WorkbenchPlugin; //import org.eclipse.ui.internal.registry.EditorDescriptor; //import org.eclipse.ui.internal.registry.EditorRegistry; //import org.eclipse.ui.internal.registry.FileEditorMapping; //import org.eclipse.ui.internal.util.PrefUtil; //import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer; // ///** // * The file editors page presents the collection of file names and extensions // * for which the user has registered editors. It also lets the user add new // * internal or external (program) editors for a given file name and extension. // * // * The user can add an editor for either a specific file name and extension // * (e.g. report.doc), or for all file names of a given extension (e.g. *.doc) // * // * The set of registered editors is tracked by the EditorRegistery // * available from the workbench plugin. // */ //public class FileEditorsPreferencePage extends PreferencePage implements // IWorkbenchPreferencePage, Listener { // // private static final String DATA_EDITOR = "editor"; //$NON-NLS-1$ // // private static final String DATA_FROM_CONTENT_TYPE = "type"; //$NON-NLS-1$ // // protected Table resourceTypeTable; // // protected Button addResourceTypeButton; // // protected Button removeResourceTypeButton; // // protected Table editorTable; // // protected Button addEditorButton; // // protected Button removeEditorButton; // // protected Button defaultEditorButton; // // protected Label editorLabel; // // protected IWorkbench workbench; // // protected List imagesToDispose; // // protected Map editorsToImages; // // /** // * Add a new resource type to the collection shown in the top of the page. // * This is typically called after the extension dialog is shown to the user. // * // * @param newName the new name // * @param newExtension the new extension // */ // public void addResourceType(String newName, String newExtension) { // // Either a file name or extension must be provided // Assert.isTrue((newName != null && newName.length() != 0) // || (newExtension != null && newExtension.length() != 0)); // // // Wild card only valid by itself (i.e. rep* is not valid) // // And must have an extension // int index = newName.indexOf('*'); // if (index > -1) { // Assert.isTrue(index == 0 && newName.length() == 1); // Assert.isTrue(newExtension != null && newExtension.length() != 0); // } // // // Find the index at which to insert the new entry. // String newFilename = (newName + (newExtension == null // || newExtension.length() == 0 ? "" : "." + newExtension)).toUpperCase();//$NON-NLS-1$ //$NON-NLS-2$ // IFileEditorMapping resourceType; // TableItem[] items = resourceTypeTable.getItems(); // boolean found = false; // int i = 0; // // while (i < items.length && !found) { // resourceType = (IFileEditorMapping) items[i].getData(); // int result = newFilename.compareToIgnoreCase(resourceType // .getLabel()); // if (result == 0) { // // Same resource type not allowed! // MessageDialog // .openInformation( // getControl().getShell(), // WorkbenchMessages.get().FileEditorPreference_existsTitle, // WorkbenchMessages.get().FileEditorPreference_existsMessage); // return; // } // // if (result < 0) { // found = true; // } else { // i++; // } // } // // // Create the new type and insert it // resourceType = new FileEditorMapping(newName, newExtension); // TableItem item = newResourceTableItem(resourceType, i, true); // resourceTypeTable.setFocus(); // resourceTypeTable.showItem(item); // fillEditorTable(); // } // // /** // * Creates the page's UI content. // */ // protected Control createContents(Composite parent) { // imagesToDispose = new ArrayList(); // editorsToImages = new HashMap(50); // // // define container & its gridding // Composite pageComponent = new Composite(parent, SWT.NULL); // GridLayout layout = new GridLayout(); // layout.numColumns = 2; // layout.marginWidth = 0; // layout.marginHeight = 0; // pageComponent.setLayout(layout); // GridData data = new GridData(); // data.verticalAlignment = GridData.FILL; // data.horizontalAlignment = GridData.FILL; // pageComponent.setLayoutData(data); // // //layout the contents // // PreferenceLinkArea contentTypeArea = new PreferenceLinkArea(pageComponent, SWT.NONE, // "org.eclipse.ui.preferencePages.ContentTypes", WorkbenchMessages.get().FileEditorPreference_contentTypesRelatedLink,//$NON-NLS-1$ // (IWorkbenchPreferenceContainer) getContainer(),null); // // data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL); // contentTypeArea.getControl().setLayoutData(data); // // //layout the top table & its buttons // Label label = new Label(pageComponent, SWT.LEFT); // label.setText(WorkbenchMessages.get().FileEditorPreference_fileTypes); // data = new GridData(); // data.horizontalAlignment = GridData.FILL; // data.horizontalSpan = 2; // label.setLayoutData(data); // // resourceTypeTable = new Table(pageComponent, SWT.SINGLE | SWT.BORDER // | SWT.FULL_SELECTION); // resourceTypeTable.addListener(SWT.Selection, this); // resourceTypeTable.addListener(SWT.DefaultSelection, this); // data = new GridData(GridData.FILL_HORIZONTAL); // // int availableRows = DialogUtil.availableRows(pageComponent); // // data.heightHint = resourceTypeTable.getItemHeight() // * (availableRows / 8); // resourceTypeTable.setLayoutData(data); // // Composite groupComponent = new Composite(pageComponent, SWT.NULL); // GridLayout groupLayout = new GridLayout(); // groupLayout.marginWidth = 0; // groupLayout.marginHeight = 0; // groupComponent.setLayout(groupLayout); // data = new GridData(); // data.verticalAlignment = GridData.FILL; // data.horizontalAlignment = GridData.FILL; // groupComponent.setLayoutData(data); // // addResourceTypeButton = new Button(groupComponent, SWT.PUSH); // addResourceTypeButton.setText(WorkbenchMessages.get().FileEditorPreference_add); // addResourceTypeButton.addListener(SWT.Selection, this); // addResourceTypeButton.setLayoutData(data); // setButtonLayoutData(addResourceTypeButton); // // removeResourceTypeButton = new Button(groupComponent, SWT.PUSH); // removeResourceTypeButton.setText(WorkbenchMessages.get().FileEditorPreference_remove); // removeResourceTypeButton.addListener(SWT.Selection, this); // setButtonLayoutData(removeResourceTypeButton); // // //Spacer // label = new Label(pageComponent, SWT.LEFT); // data = new GridData(); // data.horizontalAlignment = GridData.FILL; // data.horizontalSpan = 2; // label.setLayoutData(data); // // // layout the bottom table & its buttons // editorLabel = new Label(pageComponent, SWT.LEFT); // editorLabel.setText(WorkbenchMessages.get().FileEditorPreference_associatedEditors); // data = new GridData(); // data.horizontalAlignment = GridData.FILL; // data.horizontalSpan = 2; // editorLabel.setLayoutData(data); // // editorTable = new Table(pageComponent, SWT.SINGLE | SWT.BORDER); // editorTable.addListener(SWT.Selection, this); // editorTable.addListener(SWT.DefaultSelection, this); // data = new GridData(GridData.FILL_BOTH); // data.heightHint = editorTable.getItemHeight() * 7; // editorTable.setLayoutData(data); // // groupComponent = new Composite(pageComponent, SWT.NULL); // groupLayout = new GridLayout(); // groupLayout.marginWidth = 0; // groupLayout.marginHeight = 0; // groupComponent.setLayout(groupLayout); // data = new GridData(); // data.verticalAlignment = GridData.FILL; // data.horizontalAlignment = GridData.FILL; // groupComponent.setLayoutData(data); // // addEditorButton = new Button(groupComponent, SWT.PUSH); // addEditorButton.setText(WorkbenchMessages.get().FileEditorPreference_addEditor); // addEditorButton.addListener(SWT.Selection, this); // addEditorButton.setLayoutData(data); // setButtonLayoutData(addEditorButton); // // removeEditorButton = new Button(groupComponent, SWT.PUSH); // removeEditorButton.setText(WorkbenchMessages.get().FileEditorPreference_removeEditor); // removeEditorButton.addListener(SWT.Selection, this); // setButtonLayoutData(removeEditorButton); // // defaultEditorButton = new Button(groupComponent, SWT.PUSH); // defaultEditorButton.setText(WorkbenchMessages.get().FileEditorPreference_default); // defaultEditorButton.addListener(SWT.Selection, this); // setButtonLayoutData(defaultEditorButton); // // fillResourceTypeTable(); // if (resourceTypeTable.getItemCount() > 0) { // resourceTypeTable.setSelection(0); // } // fillEditorTable(); // updateEnabledState(); // // workbench.getHelpSystem().setHelp(parent, // IWorkbenchHelpContextIds.FILE_EDITORS_PREFERENCE_PAGE); // applyDialogFont(pageComponent); // // return pageComponent; // } // // /** // * The preference page is going to be disposed. So deallocate all allocated // * SWT resources that aren't disposed automatically by disposing the page // * (i.e fonts, cursors, etc). Subclasses should reimplement this method to // * release their own allocated SWT resources. // */ // public void dispose() { // super.dispose(); // if (imagesToDispose != null) { // for (Iterator e = imagesToDispose.iterator(); e.hasNext();) { // ((Image) e.next()).dispose(); // } // imagesToDispose = null; // } // if (editorsToImages != null) { // for (Iterator e = editorsToImages.values().iterator(); e.hasNext();) { // ((Image) e.next()).dispose(); // } // editorsToImages = null; // } // } // // /** // * Hook method to get a page specific preference store. Reimplement this // * method if a page don't want to use its parent's preference store. // */ // protected IPreferenceStore doGetPreferenceStore() { // return WorkbenchPlugin.getDefault().getPreferenceStore(); // } // // protected void fillEditorTable() { // editorTable.removeAll(); // FileEditorMapping resourceType = getSelectedResourceType(); // if (resourceType != null) { // IEditorDescriptor[] array = resourceType.getEditors(); // for (int i = 0; i < array.length; i++) { // IEditorDescriptor editor = array[i]; // TableItem item = new TableItem(editorTable, SWT.NULL); // item.setData(DATA_EDITOR, editor); // // Check if it is the default editor // String defaultString = null; // if (resourceType != null) { // if (resourceType.getDefaultEditor() == editor && resourceType.isDeclaredDefaultEditor(editor)) { // defaultString = WorkbenchMessages.get().FileEditorPreference_defaultLabel; // } // } // // if (defaultString != null) { // item.setText(editor.getLabel() + " " + defaultString); //$NON-NLS-1$ // } else { // item.setText(editor.getLabel()); // } // item.setImage(getImage(editor)); // } // // // now add any content type editors // EditorRegistry registry = (EditorRegistry) WorkbenchPlugin // .getDefault().getEditorRegistry(); // IContentType[] contentTypes = Platform.getContentTypeManager() // .findContentTypesFor(resourceType.getLabel()); // for (int i = 0; i < contentTypes.length; i++) { // array = registry.getEditorsForContentType(contentTypes[i]); // for (int j = 0; j < array.length; j++) { // IEditorDescriptor editor = array[j]; // // don't add duplicates // TableItem[] items = editorTable.getItems(); // TableItem foundItem = null; // for (int k = 0; k < items.length; k++) { // if (items[k].getData(DATA_EDITOR).equals(editor)) { // foundItem = items[k]; // break; // } // } // if (foundItem == null) { // TableItem item = new TableItem(editorTable, SWT.NULL); // item.setData(DATA_EDITOR, editor); // item.setData(DATA_FROM_CONTENT_TYPE, contentTypes[i]); // setLockedItemText(item, editor.getLabel()); // item.setImage(getImage(editor)); // } else { // update the item to reflect its origin // foundItem.setData(DATA_FROM_CONTENT_TYPE, contentTypes[i]); // setLockedItemText(foundItem, foundItem.getText()); // } // } // } // // } // } // // /** // * Set the locked message on the item. Assumes the item has an instance of // * IContentType in the data map. // * // * @param item the item to set // * @param baseLabel the base label // */ // private void setLockedItemText(TableItem item, String baseLabel) { // item.setText(NLS // .bind(WorkbenchMessages.get().FileEditorPreference_isLocked, // baseLabel, ((IContentType) item // .getData(DATA_FROM_CONTENT_TYPE)).getName())); // } // // /** // * Place the existing resource types in the table // */ // protected void fillResourceTypeTable() { // // Populate the table with the items // IFileEditorMapping[] array = WorkbenchPlugin.getDefault() // .getEditorRegistry().getFileEditorMappings(); // for (int i = 0; i < array.length; i++) { // FileEditorMapping mapping = (FileEditorMapping) array[i]; // mapping = (FileEditorMapping) mapping.clone(); // want a copy // newResourceTableItem(mapping, i, false); // } // } // // /** // * Returns the image associated with the given editor. // */ // protected Image getImage(IEditorDescriptor editor) { // Image image = (Image) editorsToImages.get(editor); // if (image == null) { // image = editor.getImageDescriptor().createImage(); // editorsToImages.put(editor, image); // } // return image; // } // // protected FileEditorMapping getSelectedResourceType() { // TableItem[] items = resourceTypeTable.getSelection(); // if (items.length > 0) { // return (FileEditorMapping) items[0].getData(); //Table is single select // } // return null; // } // // protected IEditorDescriptor[] getAssociatedEditors() { // if (getSelectedResourceType() == null) { // return null; // } // if (editorTable.getItemCount() > 0) { // ArrayList editorList = new ArrayList(); // for (int i = 0; i < editorTable.getItemCount(); i++) { // editorList.add(editorTable.getItem(i).getData(DATA_EDITOR)); // } // // return (IEditorDescriptor[]) editorList // .toArray(new IEditorDescriptor[editorList.size()]); // } // return null; // } // // public void handleEvent(Event event) { // if (event.widget == addResourceTypeButton) { // promptForResourceType(); // } else if (event.widget == removeResourceTypeButton) { // removeSelectedResourceType(); // } else if (event.widget == addEditorButton) { // promptForEditor(); // } else if (event.widget == removeEditorButton) { // removeSelectedEditor(); // } else if (event.widget == defaultEditorButton) { // setSelectedEditorAsDefault(); // } else if (event.widget == resourceTypeTable) { // fillEditorTable(); // } // // updateEnabledState(); // // } // // /** // * @see IWorkbenchPreferencePage // */ // public void init(IWorkbench aWorkbench) { // this.workbench = aWorkbench; // noDefaultAndApplyButton(); // } // // /* // * Create a new <code>TableItem</code> to represent the resource // * type editor description supplied. // */ // protected TableItem newResourceTableItem(IFileEditorMapping mapping, // int index, boolean selected) { // Image image = mapping.getImageDescriptor().createImage(false); // if (image != null) { // imagesToDispose.add(image); // } // // TableItem item = new TableItem(resourceTypeTable, SWT.NULL, index); // if (image != null) { // item.setImage(image); // } // item.setText(mapping.getLabel()); // item.setData(mapping); // if (selected) { // resourceTypeTable.setSelection(index); // } // // return item; // } // // /** // * This is a hook for sublcasses to do special things when the ok // * button is pressed. // * For example reimplement this method if you want to save the // * page's data into the preference bundle. // */ // public boolean performOk() { // TableItem[] items = resourceTypeTable.getItems(); // FileEditorMapping[] resourceTypes = new FileEditorMapping[items.length]; // for (int i = 0; i < items.length; i++) { // resourceTypes[i] = (FileEditorMapping) (items[i].getData()); // } // EditorRegistry registry = (EditorRegistry) WorkbenchPlugin.getDefault() // .getEditorRegistry(); // cast to allow save to be called // registry.setFileEditorMappings(resourceTypes); // registry.saveAssociations(); // // PrefUtil.savePrefs(); // return true; // } // // /** // * Prompt for editor. // */ // public void promptForEditor() { // EditorSelectionDialog dialog = new EditorSelectionDialog(getControl() // .getShell()); // dialog.setEditorsToFilter(getAssociatedEditors()); // dialog // .setMessage(NLS.bind(WorkbenchMessages.get().Choose_the_editor_for_file,getSelectedResourceType().getLabel() )); // if (dialog.open() == Window.OK) { // EditorDescriptor editor = (EditorDescriptor) dialog // .getSelectedEditor(); // if (editor != null) { // int i = editorTable.getItemCount(); // boolean isEmpty = i < 1; // TableItem item = new TableItem(editorTable, SWT.NULL, i); // item.setData(DATA_EDITOR, editor); // if (isEmpty) { // item // .setText(editor.getLabel() // + " " + WorkbenchMessages.get().FileEditorPreference_defaultLabel); //$NON-NLS-1$ // } else { // item.setText(editor.getLabel()); // } // item.setImage(getImage(editor)); // editorTable.setSelection(i); // editorTable.setFocus(); // getSelectedResourceType().addEditor(editor); // if (isEmpty) { // getSelectedResourceType().setDefaultEditor(editor); // } // updateSelectedResourceType(); //in case of new default // } // } // } // // /** // * Prompt for resource type. // */ // public void promptForResourceType() { // FileExtensionDialog dialog = new FileExtensionDialog(getControl() // .getShell(), WorkbenchMessages.get().FileExtension_shellTitle, // IWorkbenchHelpContextIds.FILE_EXTENSION_DIALOG, // WorkbenchMessages.get().FileExtension_dialogTitle, // WorkbenchMessages.get().FileExtension_fileTypeMessage, // WorkbenchMessages.get().FileExtension_fileTypeLabel); // if (dialog.open() == Window.OK) { // String name = dialog.getName(); // String extension = dialog.getExtension(); // addResourceType(name, extension); // } // } // // /** // * Remove the editor from the table // */ // public void removeSelectedEditor() { // TableItem[] items = editorTable.getSelection(); // boolean defaultEditor = editorTable.getSelectionIndex() == 0; // if (items.length > 0) { // getSelectedResourceType().removeEditor( // (EditorDescriptor) items[0].getData(DATA_EDITOR)); // items[0].dispose(); //Table is single selection // } // if (defaultEditor && editorTable.getItemCount() > 0) { // TableItem item = editorTable.getItem(0); // // explicitly set the new editor first editor to default // getSelectedResourceType().setDefaultEditor( // (EditorDescriptor) item.getData(DATA_EDITOR)); // if (item != null) { // item // .setText(((EditorDescriptor) (item.getData(DATA_EDITOR))) // .getLabel() // + " " + WorkbenchMessages.get().FileEditorPreference_defaultLabel); //$NON-NLS-1$ // } // if (!isEditorRemovable(item)) { // setLockedItemText(item, item.getText()); // } // } // // } // // /** // * Remove the type from the table // */ // public void removeSelectedResourceType() { // TableItem[] items = resourceTypeTable.getSelection(); // if (items.length > 0) { // items[0].dispose(); //Table is single selection // } // //Clear out the editors too // editorTable.removeAll(); // } // // /** // * Add the selected editor to the default list. // */ // public void setSelectedEditorAsDefault() { // TableItem[] items = editorTable.getSelection(); // if (items.length > 0) { // // First change the label of the old default // TableItem oldDefaultItem = editorTable.getItem(0); // oldDefaultItem // .setText(((EditorDescriptor) oldDefaultItem.getData(DATA_EDITOR)) // .getLabel()); // // update the label to reflect the locked state // if (!isEditorRemovable(oldDefaultItem)) { // setLockedItemText(oldDefaultItem, oldDefaultItem.getText()); // } // // Now set the new default // EditorDescriptor editor = (EditorDescriptor) items[0].getData(DATA_EDITOR); // getSelectedResourceType().setDefaultEditor(editor); // IContentType fromContentType = (IContentType) items[0].getData(DATA_FROM_CONTENT_TYPE); // items[0].dispose(); //Table is single selection // TableItem item = new TableItem(editorTable, SWT.NULL, 0); // item.setData(DATA_EDITOR, editor); // if (fromContentType != null) { // item.setData(DATA_FROM_CONTENT_TYPE, fromContentType); // } // item // .setText(editor.getLabel() // + " " + WorkbenchMessages.get().FileEditorPreference_defaultLabel); //$NON-NLS-1$ // item.setImage(getImage(editor)); // if (!isEditorRemovable(item)) { // setLockedItemText(item, item.getText()); // } // editorTable.setSelection(new TableItem[] { item }); // } // } // // /** // * Update the enabled state. // */ // public void updateEnabledState() { // //Update enabled state // boolean resourceTypeSelected = resourceTypeTable.getSelectionIndex() != -1; // boolean editorSelected = editorTable.getSelectionIndex() != -1; // // removeResourceTypeButton.setEnabled(resourceTypeSelected); // editorLabel.setEnabled(resourceTypeSelected); // addEditorButton.setEnabled(resourceTypeSelected); // removeEditorButton.setEnabled(editorSelected && isEditorRemovable()); // defaultEditorButton.setEnabled(editorSelected); // } // // /** // * Return whether the selected editor is removable. An editor is removable // * if it is not submitted via a content-type binding. // * // * @return whether the selected editor is removable // * @since 3.1 // */ // private boolean isEditorRemovable() { // TableItem[] items = editorTable.getSelection(); // if (items.length > 0) { // return isEditorRemovable(items[0]); // } // return false; // } // // /** // * Return whether the given editor is removable. An editor is removable // * if it is not submitted via a content-type binding. // * // * @param item the item to test // * @return whether the selected editor is removable // * @since 3.1 // */ // private boolean isEditorRemovable(TableItem item) { // IContentType fromContentType = (IContentType) item.getData(DATA_FROM_CONTENT_TYPE); // return fromContentType == null; // } // // /** // * Update the selected type. // */ // public void updateSelectedResourceType() { // // TableItem item = resourceTypeTable.getSelection()[0]; //Single select // // Image image = ((IFileEditorMapping)item.getData()).getImageDescriptor().getImage(); // // imagesToDispose.addElement(image); // // item.setImage(image); // } //}